package ar.edu.ufasta.presupuestos.servicios.web;

import ar.edu.ufasta.presupuestos.logica.entidades.estados.Aprovado;
import ar.edu.ufasta.presupuestos.logica.entidades.estados.Desaprovado;
import ar.edu.ufasta.presupuestos.logica.entidades.presupuesto.Presupuesto;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ObjectID;
import ar.edu.ufasta.presupuestos.servicios.presupuesto.PresupuestoServiceFacade;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.RequestPack;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.ResponsePack;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.TransaccionPresupuestoRequest;
import ar.edu.ufasta.presupuestos.servicios.web.netpacks.TransaccionPresupuestoResponse;

public class TransaccionPresupuestos extends Protocol {

	private TransaccionPresupuestoRequest request;
	private TransaccionPresupuestoResponse response;
	
	public TransaccionPresupuestos(){
		super();
		response = new TransaccionPresupuestoResponse();
	}
	
	@Override
	public int execute() {
		response.setProtocol(Constantes.PROTOCOL_100);
		response.setSystemCode(Constantes.SYSTEM_CODE);
		response.setResultCode(Constantes.TRANSACTION_OK);
		
		Presupuesto miPresupuesto;
		try {
			miPresupuesto = PresupuestoServiceFacade.getInstancia().getPresupuesto(new ObjectID(request.getIdPresupuesto()));
			if (miPresupuesto == null){
				response.setResultCode(Constantes.ERROR_PRESUPUESTO_MISSING);
				LogFile.write("---- Transaction Result -> PRESUPUESTO NO EXISTE");
				return -1;
			}
			if (miPresupuesto.getEstadoCode() != 1){
				if (miPresupuesto.getEstadoCode() == 2){
					response.setResultCode(Constantes.ERROR_PRESUPUESTO_ALREADY_APROVED);	
					LogFile.write("---- Transaction Result -> PRESUPUESTO YA ALTERADO");
				}else{
					if (miPresupuesto.getEstadoCode() == 3){
						response.setResultCode(Constantes.ERROR_PRESUPUESTO_ALREADY_DISAPROVED);
						LogFile.write("---- Transaction Result -> PRESUPUESTO YA ALTERADO");
					}else{
						response.setResultCode(Constantes.ERROR_PRESUPUESTO_NOT_VALID);	
						LogFile.write("---- Transaction Result -> PRESUPUESTO INVALIDO");
					}
				}
				return -1;
			}
			switch (request.getTipoOperacion()) {
			case Constantes.TRANSACTION_APROBAR:
				miPresupuesto.setEstado(new Aprovado());
				LogFile.write("---- Transaction Result -> TRANSACCION OK");
				break;
			case Constantes.TRANSACTION_DESAPROBAR:
				miPresupuesto.setEstado(new Desaprovado());
				LogFile.write("---- Transaction Result -> TRANSACCION OK");
				break;
			default:
				response.setResultCode(Constantes.ERROR_TRANSACTION_INVALID);
				LogFile.write("---- Transaction Result -> CODIGO TRANSACCION ERRONEO ->"+request.getTipoOperacion()+" ?");
				break;
			}
			PresupuestoServiceFacade.getInstancia().updatePresupuesto(miPresupuesto);
			
		} catch (Exception e) {
			response.setResultCode(Constantes.ERROR_SERVER_ERROR);
			LogFile.write("**** Error in MySQL queries ****");
			return -1;
		}		
		return 0;
	}

	/**
	 * @return the request
	 */
	public TransaccionPresupuestoRequest getRequest() {
		return request;
	}

	/**
	 * @return the response
	 */
	public TransaccionPresupuestoResponse getResponse() {
		return response;
	}

	/**
	 * @param request the request to set
	 */
	public void setRequest(TransaccionPresupuestoRequest request) {
		this.request = request;
	}

	/**
	 * @param response the response to set
	 */
	public void setResponse(TransaccionPresupuestoResponse response) {
		this.response = response;
	}

	@Override
	public String getOperationMsg() {
		return "---- Received Request   -> TRANSACCION-PRESUPUESTO";
	}

	@Override
	public ResponsePack getRespuesta() {
		return (TransaccionPresupuestoResponse)this.response;
	}

	@Override
	public void setPedido(RequestPack request) {
		this.request = (TransaccionPresupuestoRequest)request;		
	}

}
